package ndk;

import java.util.UUID;
/*
 * JNI 与 C 函数的调用
 * 1.Java native 成员方法，有参，无参调用JNI方法
 * 2.Java native 静态方法，有参，无参调用JNI方法
 * 3.C层访问Java层成员变量与静态变量
 * 4.C层访问Java层成员函数与静态函数
 * 
 * 小小知识点：
 * 1.JNI获取class，获取object
 * 2.JNI获取field
 * 3.JNI调用Call Java方法
 * 4.JNI方法签名
 * 5.字符串处理
 * */
public class JNInvoke {

	// Java层变量
	public String varName = "Tom";

	// 定义静态Java层变量
	public static int varAge = 12;

	// 定义Java方法，提供给JNI调用
	public int add(int number1, int number2){
		return number1 + number2;
	}
	
	// 定义Java静态方法给JNI调用
	public static String getUUID(){
		return UUID.randomUUID().toString();
	}

	public static void main(String[] args){
	
		JNInvoke jniApp = new JNInvoke();
		
		// JNI的方式去修改Java层实例变量
		System.out.println("修改前 varName = " + jniApp.varName);
		jniApp.modifyChars();
		System.out.println("修改后 varName = " + jniApp.varName);	
		
		// JNI的方式去修改Java层的静态变量
		System.out.println("修改前 varAge = " + varAge);
		modifyAge();
		System.out.println("修改后 varAge = " + varAge);	
	
		// Java层发起JNI调用，然后JNI去调用Java方法
		jniApp.callAddMethod();
		
		// JNI调用Java层的静态方法
		callUUID(5,"invoke JNI");

	}

	/*
	 * 定义jni函数-Native层去修改Java层变量
	 * */
	private native void modifyChars();

	/*
	 * 定义静态native函数
	 * */
	private static native void modifyAge();

	/*
	 * 定义Native方法，去调用Java层的方法
	 * */
	private native void callAddMethod();

	/*
	 * 定义Native方法，并传递Java层参数传递到JNI层
	 * */
	private static native String callUUID(int from,String to);

	static{
		// 引入编译好的动态库
		// System.loadLibrary		加载apk中libs中的so库，或者是系统环境变量中的so库
		// System.load				加载指定路径中的so库
		System.load("/home/wukj/works/NDK-Grammar/src/com/ndk/grammar/libinvoke.so");
	}

}




